﻿using System.Collections.Generic;
using System.Linq;
using PersonaLibrary.PersonaliiReference;
using PersonaLibrary.View;

namespace PersonaLibrary.ViewModel.DepartmentsViewModel
{
	internal class DepartmentViewModel : ReferenceEditableItem<Department>
    {
        #region Private members

		private RelayCommand _changeOrganizationCommand;
		private RelayCommand _addEmployeeCommand;

        #endregion

        #region Ctor
        
        public DepartmentViewModel()
        {
            EditableItem = new Department();
        }

        public DepartmentViewModel(int id)
        {
        	EditableItem = Context.TryCreateAndExecuteQuery<Department>(string.Format("{0}?$filter=Id eq {1}", typeof (Department).Name, id), "Не удалось загрузить отдел").FirstOrDefault();
			if (EditableItem != null)
			{
				Context.TryLoadProperty(EditableItem, "Organization", "Не удалось загрузить организацию к которой принадлежит отдел");
				Context.TryLoadProperty(EditableItem, "ConnectionJobEmplDep", "Не удалось загрузить сотрудников");
				foreach (ConnectionJobEmplDep connectionJobEmplDep in EditableItem.ConnectionJobEmplDep)
				{
					Context.TryLoadProperty(connectionJobEmplDep, "Employee", "Не удалось загрузить сотрудников");
					Context.TryLoadProperty(connectionJobEmplDep, "Job", "Не удалось загрузить должности");
				}
			}
        }
		
        #endregion
        
        #region Public properties

		public RelayCommand ChangeOrganizationCommand
		{
			get
			{
				if(_changeOrganizationCommand == null)
					_changeOrganizationCommand = new RelayCommand(x => ChangeOrganization(), x => true);
				return _changeOrganizationCommand;
			}
		}

		public RelayCommand AddEmployeeCommand
		{
			get
			{
				if(_addEmployeeCommand == null)
					_addEmployeeCommand = new RelayCommand(x => AddEmployee(), x => true);
				return _addEmployeeCommand;
			}
		}

		#endregion

		private void AddEmployee()
		{
			if (EditableItem.Id == 0)
			{
				CurrentApplication.ShowMessage("Невозможно добавить сотрудника в отдел которого нет в базе. Сохраните отдел и попробуйте снова.");
			}
			else
			{
				var selectedJobs = Context.TryCreateAndExecuteQuery<Job>(@"Job?$select=Name,Id",
				                                                         "Не удалось загрузить cписок должностей");

				SelectFromCollection selectFrom = new SelectFromCollection
				                                  	{Values = selectedJobs.ToDictionary(x => x.Name, x => x.Id)};

				if (selectFrom.ShowDialog().GetValueOrDefault())
				{
					var selectedOrgs = Context.TryCreateAndExecuteQuery<Employee>(@"Employee?$select=Name,Id",
					                                                         "Не удалось загрузить cписок сотрудников");
					SelectFromCollection selectFrom1 = new SelectFromCollection
					                                   	{Values = selectedOrgs.ToDictionary(x => x.FullName, x => x.Id)};

					if (selectFrom1.ShowDialog().GetValueOrDefault())
					{
						ConnectionJobEmplDep connectionJobEmplDep = new ConnectionJobEmplDep();
						connectionJobEmplDep.Department = EditableItem;
						connectionJobEmplDep.DepartmentId = EditableItem.Id;

						connectionJobEmplDep.JobId = (int) selectFrom.SelectedValue;
						connectionJobEmplDep.Job = Context.TryCreateAndExecuteQuery<Job>(string.Format("Job?$filter=Id eq {0}", connectionJobEmplDep.JobId), 
							"Не удалось загрузить должность").FirstOrDefault();

						connectionJobEmplDep.EmployeeId = (int)selectFrom1.SelectedValue;
						connectionJobEmplDep.Employee = Context.TryCreateAndExecuteQuery<Employee>(string.Format("Employee?$filter=Id eq {0}", connectionJobEmplDep.EmployeeId),
							"Не удалось загрузить сотрудника").FirstOrDefault();
					}
				}
			}
		}

		private void ChangeOrganization()
		{
			var selectedOrgs = Context.TryCreateAndExecuteQuery<Organization>("Organization?$select=Id,Name", "Не удалось загрузить cписок организаций");
			SelectFromCollection selectFrom = new SelectFromCollection { Values = selectedOrgs.ToDictionary(x => x.Name, x => x.Id) };
			if (selectFrom.ShowDialog().GetValueOrDefault())
			{
				EditableItem.OrganizationId = (int)selectFrom.SelectedValue;
				EditableItem.Organization = Context.TryCreateAndExecuteQuery<Organization>(string.Format("Organization?$filter=Id eq {0}", EditableItem.OrganizationId), "Не удалось загрузить cписок организаций").FirstOrDefault();
			}
		}

        #region Parent override

        public override bool CanCommit()
        {
			if(EditableItem.OrganizationId == 0)
				return false;

        	return base.CanCommit();
        }

        #endregion
    }
}
